﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     dev
**Author:      MiPeng
**Date:        2021/12/14
**Description: 束对中调节组件Item， 左键支持灵敏度调节，右键为全屏映射
*****************************************************/

#ifndef CROSSEQITEM_H
#define CROSSEQITEM_H

#include "../generalui_global.h"
#include "../GlobalUIDef.h"

#include <QGraphicsObject>
#include <QTime>

namespace GeneralUI {

	class GENERALUI_EXPORT CrossEQItem : public QGraphicsObject
	{
		Q_OBJECT

	public:
		/**
		 * @brief  CrossEQItem  默认构造函数
		 * @param  parent
		 * @return
		 */
		CrossEQItem(QObject *parent = nullptr);

		/**
		 * @brief  ~CrossEQItem  默认析构函数
		 * @return
		 */
		~CrossEQItem();

	public:
		/**
		 * @brief  setItemSize  设置大小
		 * @param  width
		 * @param  height
		 * @return void
		 */
		void setItemSize(int width, int height);

		/**
		 * @brief  setValue  设置当前值
		 * @param  value
		 * @return void
		 */
		void setValue(double valueX, double valueY);

		/**
		 * @brief  getValue  获取当前值
		 * @param  valueX  X方向值
		 * @param  valueY  Y方向值
		 * @return QPointF
		 */
		QPointF getValue();

		/**
		 * @brief  setDecimals  浮点数滑动条设置精度
		 * @param  decs  精度
		 * @return void
		 */
		void setDecimals(int decs);

		/**
		 * @brief  setMinValue  设置最小值
		 * @param  minValue
		 * @return void
		 */
		void setMinValue(int minValue);

		/**
		 * @brief  setMaxValue  设置最大值
		 * @param  maxValue
		 * @return void
		 */
		void setMaxValue(int maxValue);

		/**
		 * @brief  setRange  设置最值
		 * @param  minValue
		 * @param  maxValue
		 * @return void
		 */
		void setRange(int minValue, int maxValue);

		/**
		 * @brief  setRange  设置最值
		 * @param  xMin  X最小值
		 * @param  xMax  X最大值
		 * @param  yMin  Y最小值
		 * @param  yMax  Y最大值
		 * @return void
		 */
		void setRange(int xMin, int xMax, int yMin, int yMax);

		/**
		 * @brief  setPixStep  设置鼠标左键移动灵敏度
		 * @param  step  灵敏度-移动1像素时值得变化量
		 * @return void
		 */
		void setPixStep(double step);

		/**
		 * @brief  setEnabled  设置是否启用
		 * @param  isEnable
		 * @return void
		 */
		void setEnabled(bool isEnable);

		/**
		 * @brief  hasFocus 焦点判断
		 * @return bool
		 */
		bool hasFocus() const;

	Q_SIGNALS:
		/**
		 * @brief  signalValueChange  数据变化信号
		 * @param  valueX  X方向数据
		 * @param  valueY  Y方向数据
		 * @return void
		 */
		void signalValueChange(double valueX, double valueY);

		/**
		 * @brief  signalMouseRelease  鼠标释放信号
		 * @return void
		 */
		void signalMouseRelease();

	protected:
		/**
		 * @brief  paint  重写QGraphicsItem Paint函数
		 * @param  painter
		 * @param  option
		 * @param  widget
		 * @return void
		 */
		void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;

		/**
		 * @brief  hoverMoveEvent  鼠标悬浮事件
		 * @param  event
		 * @return void
		 */
		void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override;

		/**
		 * @brief  mouseMoveEvent  鼠标移动事件
		 * @param  event
		 * @return void
		 */
		void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;

		/**
		 * @brief  mousePressEvent  鼠标单击事件
		 * @param  event
		 * @return void
		 */
		void mousePressEvent(QGraphicsSceneMouseEvent *event) override;

		/**
		 * @brief  mouseReleaseEvent  鼠标释放事件
		 * @param  event
		 * @return void
		 */
		void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;

		/**
		 * @brief  boundingRect  重写boundRect函数
		 * @return QT_NAMESPACE::QRect
		 */
		QRectF boundingRect()const override;

	private:
		/**
		 * @brief  init  初始化
		 * @return void
		 */
		void init();

		/**
		 * @brief  calPainterPath  计算绘制元素位置
		 * @return void
		 */
		void calPainterPath();

		/**
		 * @brief  updateUI  刷新组件
		 * @return void
		 */
		void updateUI();

		/**
		 * @brief  initForm  精度变化后调整对应参数
		 * @return void
		 */
		void initForm(double newMultiple);

		/**
		 * @brief  notifyValueChange  通知信号变化
		 * @return void
		 */
		void notifyValueChange();

	private:
		/**  调节模式
		 */
		enum MoveMode
		{
			None,           ///< 空
			AllMove,        ///< 水平和垂直
			VerMove,        ///< 垂直调节
			HorMove         ///< 水平调节
		};

	private:
		/**  父对象
		 */
		QObject *m_parentObj;

		/** 是否全屏映射
		 */
		bool m_isScreenMap;

		/** 是否启用
		 */
		bool m_isEnabled;

		/** 当前模式
		 */
		MoveMode m_moveMode;

		/** 鼠标移动节流
		 */
		QTime *m_mouseMove;

		/** 中心点位置
		 */
		QPointF m_centerPoint;

		/** 上次鼠标位置
		 */
		QPointF m_lastPoint;

		/** 鼠标按下位置
		 */
		QPointF m_mousePressPoint;

		/** 中心块
		 */
		QPainterPath m_centerPath;

		/** 水平线
		 */
		QPainterPath m_horPath;

		/** 垂直线
		 */
		QPainterPath m_verPath;

		/** 控件宽度
		 */
		int m_width;

		/** 控件高度
		 */
		int m_height;

		/** 中心方块大小
		 */
		int m_centerBlockSize;

		/** 当前X值
		 */
		double m_valueX;

		/** 当前Y值
		 */
		double m_valueY;

		/** 上次X值
		 */
		double m_lastValueX;

		/** 上次Y值
		 */
		double m_lastValueY;

		/** 控件最大值
		 */
		double m_xMaxValue;
		double m_yMaxValue;

		/** 控件最小值
		 */
		double m_xMinValue;
		double m_yMinValue;

		/** 鼠标左键移动灵敏度-鼠标移动多少像素时，线条移动1像素
		 */
		double m_pixStep;

		/** 屏幕宽度和高度
		 */
		QRect m_screenRect;

		/**  浮点数输出时输出精度，默认为0
		 */
		int m_decimals;

		/**  数值映射倍数
		 */
		int m_multiple;
	};

}//

#endif // CROSSEQITEM_H
